/**
 * @desc 防抖函数
 * @param {需要防抖的函数} func
 * @param {延迟时间} wait
 * @param {是否立即执行} immediate
 */

// 防抖函数用法：

// 结构正常写
/* <el-button type="primary" @click="jump('参数')">查询</el-button> */

// methods方法这么写：这里注意function可以让你this指向实例
//  jump: debounce(
//     function (参数) {
//       console.log(参数);
//     },
//     500, //间隔时间
//     true //是否立即执行
//   ),

export function debounce(func, wait, immediate) {
  let timeout // 计时器
  return function(...args) { // args就是传的参数
    const context = this
    if (timeout) clearTimeout(timeout)// 如果有计时器就清除计时器
    if (immediate) { // 如果立即执行设置为true
      const callNow = !timeout // 定时器为空就是true
      timeout = setTimeout(function() { // 开启定时器
        timeout = null
      }, wait)// wait：定时器的时间
      if (callNow) func.apply(context, args)// 定时器为空的话就执行把传进来的函数指向改变为这个防抖函数，然后把参数传给这个防抖函数。通过return把参数返回。
    } else {
      // 立即执行为false就开个定时器在执行这个函数
      timeout = setTimeout(function() {
        func.apply(context, args)
      }, wait)
    }
  }
}

